package com.yequan.thread.semaphore;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * @author yq
 * @date 2020/05/26
 */
public class SemaphoreTest {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        //创建Semaphore信号量，初始化许可大小为3
        final Semaphore sp = new Semaphore(3);
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e2) {
                e2.printStackTrace();
            }
            Runnable runnable = () -> {
                try {
                    //请求获得许可，如果有可获得的许可则继续往下执行，许可数减1。否则进入阻塞状态
                    sp.acquire();
                    System.out.println("线程" + Thread.currentThread().getName() + "进入，当前已有" + (3 - sp.availablePermits()) + "个并发");
                    Thread.sleep((long) (Math.random() * 10000));
                    System.out.println("线程" + Thread.currentThread().getName() + "即将离开");
                    //释放许可，许可数加1
                    sp.release();
                    //下面代码有时候执行不准确，因为其没有和上面的代码合成原子单元
                    System.out.println("线程" + Thread.currentThread().getName() + "已离开，当前已有" + (3 - sp.availablePermits()) + "个并发");
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            };
            service.execute(runnable);
        }
    }
}
